package br.com.sgc.dao;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import br.com.sgc.entities.geral.ExamePaciente;
import br.com.sgc.entities.geral.FichaPaciente;
import br.com.sgc.entities.geral.Paciente;
import br.com.sgc.entities.geral.PacienteAnimal;
import br.com.sgc.entities.geral.PacientePessoa;
import br.com.sgc.entities.geral.Procedimento;
import br.com.sgc.entities.geral.Receituario;
import br.com.sgc.entities.geral.Tratamento;
import br.com.sgc.entities.veterinaria.Animal;

@Stateless
public class FichaPacienteDao extends GenericDao<FichaPaciente>{

	private static final long serialVersionUID = 3175414535852792759L;
	
	@EJB private AnimalDao animalDao;
	
	@Override
	public FichaPaciente findById(Class<FichaPaciente> modelClass, Object id,
			Boolean initializeDependecies) {
		// T t = em.find(modelClass, id);
		FichaPaciente ficha = em.find(modelClass, id	);
		if (ficha != null){
			ficha.getAgendamento().toString();
			ficha.getAgendamento().getMedico().toString();
			ficha.getAgendamento().getClinica().toString();
			if(ficha.getPaciente() != null){
				ficha.getPaciente().toString();
				if(ficha.getPaciente() instanceof PacienteAnimal){
					((PacienteAnimal)ficha.getPaciente()).getAnimal().toString();
					((PacienteAnimal)ficha.getPaciente()).setAnimal(animalDao.findById(Animal.class, ((PacienteAnimal)ficha.getPaciente()).getAnimal().getId(), false));
				} else if(ficha.getPaciente() instanceof PacientePessoa) {
					((PacientePessoa)ficha.getPaciente()).getPessoa().toString();
				}
				
			}
			
			
			
			if(ficha.getReceituario() != null)
				ficha.getReceituario().toString();
			
			if(ficha.getProcedimento() != null)
				ficha.getProcedimento().toString();
			
			if(ficha.getTratamentos() != null)
				ficha.getTratamentos().size();
			
			if(ficha.getExamesPaciente() != null){
				ficha.getExamesPaciente().size();
				for(ExamePaciente exame: ficha.getExamesPaciente()){
					exame.getExame().toString();
				}
			}
			
		}
		
		return ficha;
	}

	@SuppressWarnings("unchecked")
	public List<FichaPaciente> findAllFichasByPaciente(Paciente paciente) {
		Criteria criteria = getCriteria(FichaPaciente.class);
		criteria.add(Restrictions.eq("paciente.id", paciente.getId()));
		criteria.createAlias("agendamento", "agendamento");
		
		
		criteria.addOrder(Order.desc("agendamento.dataAgendamento"));
		criteria.addOrder(Order.desc("agendamento.horaAgendamento"));
		
		List<FichaPaciente> list =  criteria.list();
		for(FichaPaciente ficha: list){
			if(ficha.getReceituario() != null){
				ficha.getReceituario().toString();
			} else {
				ficha.setReceituario(new Receituario());
			}
			
			if(ficha.getProcedimento() != null){
				ficha.getProcedimento().toString();
			} else {
				ficha.setProcedimento(new Procedimento());
			}
			
			if(ficha.getTratamentos() != null){
				ficha.getTratamentos().toString();
			} else {
				ficha.setTratamentos(new ArrayList<Tratamento>());
			}
			
			if(ficha.getAgendamento() != null)
				ficha.getAgendamento().toString();
			
			if(ficha.getExamesPaciente() != null){
				ficha.getExamesPaciente().size();
				for(ExamePaciente exame: ficha.getExamesPaciente()){
					exame.getExame().toString();
				}
			}
		}
		
		return list;
	}

	@SuppressWarnings("unchecked")
	public List<FichaPaciente> findAllFichasByPacienteAnimal(Animal animal) {
		Criteria criteria = getCriteria(FichaPaciente.class);
		criteria.add(Restrictions.eq("pacienteAnimal.id", animal.getId()));
		criteria.createAlias("agendamento", "agendamento");
		
		
		criteria.addOrder(Order.desc("agendamento.dataAgendamento"));
		criteria.addOrder(Order.desc("agendamento.horaAgendamento"));
		
		List<FichaPaciente> list =  criteria.list();
		for(FichaPaciente ficha: list){
			if(ficha.getReceituario() != null){
				ficha.getReceituario().toString();
			} else {
				ficha.setReceituario(new Receituario());
			}
			
			if(ficha.getProcedimento() != null){
				ficha.getProcedimento().toString();
			} else {
				ficha.setProcedimento(new Procedimento());
			}
			
			if(ficha.getTratamentos() != null){
				ficha.getTratamentos().toString();
			} else {
				ficha.setTratamentos(new ArrayList<Tratamento>());
			}
			
			if(ficha.getAgendamento() != null)
				ficha.getAgendamento().toString();
			
			if(ficha.getExamesPaciente() != null){
				ficha.getExamesPaciente().size();
				for(ExamePaciente exame: ficha.getExamesPaciente()){
					exame.getExame().toString();
				}
			}
		}
		
		return list;
	}

}
